home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / SWAG / SWAGA_C / COMM.SWG / 0024_Another Fossil Unit.pas < prev    next >
Pascal/Delphi Source File  |  1993-08-27  |  12KB  |  487 lines

  1. {
  2. STEVE GABRILOWITZ
  3.  
  4. > I was wondering if anyone had any routines they could send me or tell
  5. > me where to find some routines that show you have to use the
  6. > fossil I have a file on my BBS called TPIO_100.ZIP,
  7. }
  8.  
  9. Unit IO;
  10.  
  11.  
  12.               { FOSSIL communications I/O routines }
  13.               { Turbo Pascal Version by Tony Hsieh }
  14.  
  15.   {}{}{}{ Copyright (c) 1989 by Tony Hsieh, All Rights Reserved. }{}{}{}
  16.  
  17.  
  18. { The following routines are basic input/output routines, using a }
  19. { fossil driver.  These are NOT all the routines that a fossil    }
  20. { driver can do!  These are just a portion of the functions that  }
  21. { fossil drivers can do.  However, these are the only ones most   }
  22. { people will need.  I highly recommend for those that use this   }
  23. { to download an arced copy of the X00.SYS driver.  In the arc    }
  24. { is a file called "FOSSIL.DOC", which is where I derived my      }
  25. { routines from.  If there are any routines that you see are not  }
  26. { implemented here, use FOSSIL.DOC to add/make your own!  I've    }
  27. { listed enough examples here for you to figure out how to do it  }
  28. { yourself.                                                       }
  29. { This file was written as a unit for Turbo Pascal v4.0.  You     }
  30. { should compile it to DISK, and then in your own program type    }
  31. { this right after your program heading (before Vars and Types)   }
  32. { this: "uses IO;"                                                }
  33. { EXAMPLE: }
  34. {
  35.  
  36. Program Communications;
  37.  
  38. uses IO;
  39.  
  40. begin
  41.   InitializeDriver;
  42.   Writeln ('Driver is initalized!');
  43.   ModemSettings (1200,8,'N',1); Baud := 1200;
  44.   DTR (0); Delay (1000); DTR (1);
  45.   Writeln ('DTR is now true!');
  46.   CloseDriver;
  47.   Writeln ('Driver is closed!');
  48. end.
  49.  
  50. }
  51.  
  52. { Feel free to use these routines in your programs; copy this  }
  53. { file freely, but PLEASE DO NOT MODIFY IT.  If you do use     }
  54. { these routines in your program, please give proper credit to }
  55. { the author.                                                  }
  56. {                                                              }
  57. { Thanks, and enjoy!                                           }
  58. {                                                              }
  59. { Tony Hsieh                                                   }
  60.  
  61.  
  62.  
  63.  
  64. INTERFACE
  65.  
  66. uses
  67.   DOS;
  68.  
  69.   { These are communications routines }
  70.   { that utilize a FOSSIL driver.  A  }
  71.   { FOSSIL driver MUST be installed,  }
  72.   { such as X00.SYS and OPUS!COM...   }
  73.  
  74. type
  75.   String255 = String [255];
  76.  
  77. var
  78.   Port : Integer;                { I decided to make 'Port' a global    }
  79.                                  { variable to make life easier.        }
  80.  
  81.   Baud : Word;                   { Same with Baud                       }
  82.  
  83.   RegistersRecord: Registers;    { DOS registers AX, BX, CX, DX, and Flags }
  84.  
  85.  
  86. procedure BlankRegisters;
  87. procedure ModemSettings(Baud, DataBits : Integer; Parity : Char;
  88.                          Stopbits : Integer);
  89. procedure InitializeDriver;
  90. procedure CloseDriver;
  91. procedure ReadKeyAhead (var First, Second : Char);
  92. function  ReceiveAhead (var Character : CHAR) : Boolean;
  93. function  Online : boolean;
  94. procedure DTR(DTRState : Integer);
  95. procedure Reboot;
  96. procedure BiosScreenWrite(Character: CHAR);
  97. procedure WatchDog(INPUT : Boolean);
  98. procedure WhereCursor(var Row : Integer; var Column : Integer);
  99. procedure MoveCursor(Row : Integer; Column : Integer);
  100. procedure KillInputBuffer;
  101. procedure KillOutputBuffer;
  102. procedure FlushOutput;
  103. function  InputAvailable : Boolean;
  104. function  OutputOkay : Boolean;
  105. procedure ReceiveCharacter(var Character : CHAR);
  106. procedure TransmitCharacter(Character : CHAR; var Status : Integer);
  107. procedure FlowControl(Control : Boolean);
  108. procedure CharacterOut(Character : CHAR);
  109. procedure StringOut(Message : String255);
  110. procedure LineOut(Message : String255);
  111. procedure CrOut;
  112.  
  113.  
  114. IMPLEMENTATION
  115.  
  116. procedure BlankRegisters;
  117. begin
  118.   Fillchar(RegistersRecord, SizeOf(RegistersRecord), 0);
  119. end;
  120.  
  121. procedure ModemSettings (Baud, DataBits : Integer; Parity : Char;
  122.                          StopBits : Integer);
  123.                                                { Do this after initializing }
  124.                                                { the FOSSIL driver and also }
  125.                                                { when somebody logs on      }
  126. var
  127.   GoingOut: Integer;
  128. begin
  129.   GoingOut := 0;
  130.   Case Baud of
  131.       0 : Exit;
  132.     100 : GoingOut := GoingOut + 000 + 00 + 00;
  133.     150 : GoingOut := GoingOut + 000 + 00 + 32;
  134.     300 : GoingOut := GoingOut + 000 + 64 + 00;
  135.     600 : GoingOut := GoingOut + 000 + 64 + 32;
  136.     1200: GoingOut := GoingOut + 128 + 00 + 00;
  137.     2400: GoingOut := GoingOut + 128 + 00 + 32;
  138.     4800: GoingOut := GoingOut + 128 + 64 + 00;
  139.     9600: GoingOut := GoingOut + 128 + 64 + 32;
  140.   end;
  141.   Case DataBits of
  142.     5: GoingOut := GoingOut + 0 + 0;
  143.     6: GoingOut := GoingOut + 0 + 1;
  144.     7: GoingOut := GoingOut + 2 + 0;
  145.     8: GoingOut := GoingOut + 2 + 1;
  146.   end;
  147.   Case Parity of
  148.     'N'    : GoingOut := GoingOut + 00 + 0;
  149.     'O','o': GoingOut := GoingOut + 00 + 8;
  150.     'n'    : GoingOut := GoingOut + 16 + 0;
  151.     'E','e': GoingOut := GoingOut + 16 + 8;
  152.   end;
  153.   Case StopBits of
  154.     1: GoingOut := GoingOut + 0;
  155.     2: GoingOut := GoingOut + 4;
  156.   end;
  157.   BlankRegisters;
  158.   With RegistersRecord do
  159.   begin
  160.     AH := 0;
  161.     AL := GoingOut;
  162.     DX := (Port);
  163.     Intr($14, RegistersRecord);
  164.   end;
  165. end;
  166.  
  167. procedure InitializeDriver;                         { Do this before doing }
  168. begin                                               { any IO routines!!!   }
  169.   BlankRegisters;
  170.   With RegistersRecord do
  171.   begin
  172.     AH := 4;
  173.     DX := (Port);
  174.     Intr($14, RegistersRecord);
  175.     If AX <> $1954 then
  176.     begin
  177.       Writeln('* FOSSIL DRIVER NOT RESPONDING!  OPERATION HALTED!');
  178.       halt(1);
  179.     end;
  180.   end;
  181. end;
  182.  
  183. procedure CloseDriver;  { Run this after all I/O routines are done with }
  184. begin
  185.   BlankRegisters;
  186.   With RegistersRecord do
  187.   begin
  188.     AH := 5;
  189.     DX := (Port);
  190.     Intr($14, RegistersRecord);
  191.   end;
  192.   BlankRegisters;
  193. end;
  194.  
  195. procedure ReadKeyAhead (var First, Second: Char); { This procedure is via  }
  196.                                                   { the FOSSIL driver, not }
  197.                                                   { DOS!                   }
  198. begin
  199.   BlankRegisters;
  200.   With RegistersRecord do
  201.   begin
  202.     AH := $0D;
  203.     Intr($14,RegistersRecord);
  204.     First := chr(lo(AX));
  205.     Second := chr(hi(AX));
  206.   end;
  207. end;
  208.  
  209. function ReceiveAhead (var Character: CHAR): Boolean;  { Non-destructive }
  210. begin
  211.   If Baud=0 then exit;
  212.   BlankRegisters;
  213.   With RegistersRecord do
  214.   begin
  215.     AH := $0C;
  216.     DX := Port;
  217.     Intr ($14,RegistersRecord);
  218.     Character := CHR (AL);
  219.     ReceiveAhead := AX <> $FFFF;
  220.   end;
  221. end;
  222.  
  223. function OnLine: Boolean;
  224. begin
  225.   BlankRegisters;
  226.   With RegistersRecord do
  227.   begin
  228.     AH := 3;
  229.     DX := (Port);
  230.     Intr ($14, RegistersRecord);
  231.     OnLine := ((AL AND 128) = 128);
  232.   end;
  233. end;
  234.  
  235. procedure DTR (DTRState: Integer);    { 1=ON, 0=OFF }
  236.                                       { Be sure that the modem dip switches }
  237.                                       { are set properly... when DTR is off }
  238.                                       { it usually drops carrier if online  }
  239. begin
  240.   BlankRegisters;
  241.   With RegistersRecord do
  242.   begin
  243.     AH := 6;
  244.     DX := (Port);
  245.     AL := DTRState;
  246.     Intr ($14, RegistersRecord);
  247.   end;
  248. end;
  249.  
  250. procedure Reboot;                  { For EXTREME emergencies... Hmmm... }
  251. begin
  252.   BlankRegisters;
  253.   With RegistersRecord do
  254.   begin
  255.     AH := 23;
  256.     AL := 1;
  257.     Intr ($14, RegistersRecord);
  258.   end;
  259. end;
  260.  
  261. {       This is ANSI Screen Write via Fossil Driver }
  262. {
  263. procedure ANSIScreenWrite (Character: CHAR);
  264. begin
  265.   BlankRegisters;
  266.   With RegistersRecord do
  267.   begin
  268.     AH := 19;
  269. (100 min left), (H)elp, More?     AL := ORD (Character);
  270.     Intr ($14, RegistersRecord);
  271.   end;
  272. end;
  273. }
  274.  
  275. { This is ANSI Screen Write via DOS! }
  276.  
  277. procedure ANSIScreenWrite (Character: CHAR);
  278. begin
  279.   BlankRegisters;
  280.   With RegistersRecord do
  281.   begin
  282.     AH := 2;
  283.     DL := ORD (Character);
  284.     Intr ($21, RegistersRecord);
  285.   end;
  286. end;
  287.  
  288.  
  289. procedure BIOSScreenWrite (Character: CHAR); { Through the FOSSIL driver }
  290. begin
  291.   BlankRegisters;
  292.   With RegistersRecord do
  293.   begin
  294.     AH := 21;
  295.     AL := ORD (Character);
  296.     Intr ($14, RegistersRecord);
  297.   end;
  298. end;
  299.  
  300. procedure WatchDog (INPUT: Boolean);
  301. begin
  302.   BlankRegisters;
  303.   With RegistersRecord do
  304.   begin
  305.     AH := 20;
  306.     DX := Port;
  307.     Case INPUT of
  308.       TRUE:  AL := 1;
  309.       FALSE: AL := 0;
  310.     end;
  311.     Intr ($14, RegistersRecord);
  312.   end;
  313. end;
  314.  
  315. procedure WhereCursor (var Row: Integer; var Column: Integer);
  316. begin
  317.   BlankRegisters;
  318.   With RegistersRecord do
  319.   begin
  320.     AH := 18;
  321.     Intr ($14, RegistersRecord);
  322.     Row := DH;
  323.     Column := DL;
  324.   end;
  325. end;
  326.  
  327. procedure MoveCursor (Row: Integer; Column: Integer);
  328. begin
  329.   BlankRegisters;
  330.   With RegistersRecord do
  331.   begin
  332.     AH := 17;
  333.     DH := Row;
  334.     DL := Column;
  335.     Intr ($14, RegistersRecord);
  336.   end;
  337. end;
  338.  
  339. procedure KillInputBuffer;   { Kills all remaining input that has not been }
  340.                              { read in yet }
  341. begin
  342.   If Baud=0 then exit;
  343.   BlankRegisters;
  344.   With RegistersRecord do
  345.   begin
  346.     AH := 10;
  347.     DX := Port;
  348.     Intr ($14, RegistersRecord);
  349.   end;
  350. end;
  351.  
  352. procedure KillOutputBuffer;  { Kills all pending output that has not been }
  353.                              { send yet }
  354. begin
  355.   If Baud=0 then exit;
  356.   BlankRegisters;
  357.   With RegistersRecord do
  358.   begin
  359.     AH := 9;
  360.     DX := Port;
  361.     Intr ($14, RegistersRecord);
  362.   end;
  363. end;
  364.  
  365. procedure FlushOutput;       { Flushes the output buffer }
  366. begin
  367.   If Baud=0 then exit;
  368.   BlankRegisters;
  369.   With RegistersRecord do
  370.   begin
  371.     AH := 8;
  372.     DX := Port;
  373.     Intr ($14, RegistersRecord);
  374.   end;
  375. end;
  376.  
  377. function InputAvailable: Boolean;   { Returns true if there's input }
  378.                                     { from the modem.               }
  379. begin
  380.   InputAvailable := False;
  381.   If Baud=0 then exit;
  382.   BlankRegisters;
  383.   With RegistersRecord do
  384.   begin
  385.     AH := 3;
  386.     DX := Port;
  387.     Intr ($14, RegistersRecord);
  388.     InputAvailable := ((AH AND 1) = 1);
  389.   end;
  390. end;
  391.  
  392. function OutputOkay: Boolean;     { Returns true if output buffer isn't full }
  393. begin
  394.   OutputOkay := True;
  395.   If Baud=0 then exit;
  396.   BlankRegisters;
  397.   With RegistersRecord do
  398.   begin
  399.     AH := 3;
  400.     DX := Port;
  401.     Intr ($14, RegistersRecord);
  402.     OutputOkay := ((AH AND 32) = 32);
  403.   end;
  404. end;
  405.  
  406. procedure ReceiveCharacter (var Character: CHAR);   { Takes a character }
  407.                                                     { out of the input  }
  408.                                                     { buffer }
  409. begin
  410.   Character := #0;
  411.   BlankRegisters;
  412.   With RegistersRecord do
  413.   begin
  414.     AH := 2;
  415.     DX := Port;
  416.     Intr ($14, RegistersRecord);
  417.     Character := CHR (AL);
  418.   end;
  419. end;
  420.  
  421. procedure TransmitCharacter (Character: CHAR; var Status: Integer);
  422. begin
  423.   BlankRegisters;
  424.   With RegistersRecord do
  425.   begin
  426.     AH := 1;
  427.     DX := Port;
  428.     AL := ORD (Character);
  429.     Intr ($14, RegistersRecord);
  430.     Status := AX;        { Refer to FOSSIL.DOC about the STATUS var }
  431.   end;
  432. end;
  433.  
  434. procedure FlowControl (Control: Boolean);
  435. begin
  436.   BlankRegisters;
  437.   With RegistersRecord do
  438.   begin
  439.     AH := 15;
  440.     DX := Port;
  441.     Case Control of
  442.          TRUE:  AL := 255;
  443.          FALSE: AL := 0;
  444.     end;
  445.     Intr ($14, RegistersRecord);
  446.   end;
  447. end;
  448.  
  449. procedure CharacterOut (Character: CHAR);
  450. var
  451.   Status: INTEGER;
  452. begin
  453.   { If SNOOP is on then }
  454.     ANSIScreenWrite (Character);
  455.   TransmitCharacter (Character, Status);
  456. end;
  457.  
  458. procedure StringOut (Message: String255);
  459. var
  460.   CharPos: Byte;
  461. begin
  462.   CharPos := 0;
  463.   If Length(Message) <> 0 then
  464.   begin
  465.     Repeat
  466.       If NOT Online then exit;
  467.       CharPos := CharPos + 1;
  468.       CharacterOut (Message [CharPos]);
  469.     Until CharPos = Length (Message);
  470.   end;
  471. end;
  472.  
  473. procedure LineOut (Message: String255);
  474. begin
  475.   StringOut (Message);
  476.   CharacterOut (#13);
  477.   CharacterOut (#10);
  478. end;
  479.  
  480. procedure CrOut; { Outputs a carriage return and a line feed }
  481. begin
  482.   CharacterOut (#13);
  483.   CharacterOut (#10);
  484. end;
  485.  
  486. end.
  487.